package com.gykfbxxh.imovie.base;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.TextView;

import com.app.utils.pulltorefresh.PullToRefreshBase;
import com.app.utils.pulltorefresh.PullToRefreshListView;
import com.gykfbxxh.imovie.R;
import com.gykfbxxh.imovie.custom.view.LoadView;
import com.gykfbxxh.imovie.listener.HttpListener;
import com.gykfbxxh.imovie.utils.AppViewUtils;
import com.gykfbxxh.imovie.utils.HttpUtils;

import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

/**
 * 拥有自定义头部
 * 通用的展示数据的listFragment 本Fragment把大部分的UI初始化以及改变已经实现，继承者只需实现
 * (1)changeData方法联网刷新数据
 * (2)onItemClick方法 listview的item的点击事件
 * 别的方法如果根据自身需要想重写的可以重写
 *
 * @param <T>
 * @author xuxinghai
 */
public abstract class BaseListHeadFragment<T> extends BaseFragment implements
        OnClickListener,OnItemClickListener, PullToRefreshBase.OnRefreshListener2<ListView> {


    public final static int NO_NET = 0;// 网络错误
    public final static int DATAERROR = 1;// 数据错误
    public final static int LOADING = 2;// 数据加载中
    public final static int LOADSUCES = 3;// 加载成功
    public final static int DATAEMPTY = 4;// 空

    // 数据变量
    protected String mPageName = "BaseListFragment";//页面标识(继承的子类一律用此变量标识页面)
    protected Activity activity;// 依附的Activity对象
    protected List<T> dataList;// 数据集合
    protected AppBaseAdapter<T> mAdapter;// 适配器

    // 控件变量
    protected PullToRefreshListView mListView;// 上拉下拉刷新listview
    protected LoadView mLoadView;// 加载数据等待提示控件
    protected View mContentView;// 重复利用的根布局
    protected TextView notify_view_text;// 蓝色通知栏内的文字

    // 逻辑变量
    protected int dataPage = 1;// 请求的数据页数
//    protected int currentScrollY;// 当前listview显示的最上面item的position
//    protected boolean isStop;// listview是否滑动



    /**************************
     * fragment必要的重写的方法 start
     **************************/
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onAttach(Activity activity) {
        this.activity = activity;
        super.onAttach(activity);
    }

    /**
     * 得到通用的展示数据的ContentView
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        if (mContentView == null) {
            mContentView = LayoutInflater.from(getActivity()).inflate(
                    R.layout.fragment_public_head_list, null);
            mListView = (PullToRefreshListView) mContentView
                    .findViewById(R.id.prlv_listview);

            mLoadView = (LoadView) mContentView.findViewById(R.id.ld_loadview);
            // Toast提示框
            notify_view_text = (TextView) mContentView
                    .findViewById(R.id.tv_notify);
            mLoadView.setErrorPageClickListener(this);
            // 配置mListView
            AppViewUtils.initPullToRefreshListView(mListView);
            mListView.setEmptyView(mLoadView);
            mListView.setOnRefreshListener(this);
            mListView.setOnItemClickListener(this);
            // 因为有的页面不需要自动加载，所以这里写成虚方法，让各自页面根据需要实现
            setListViewOnLastItemVisibleListener();
            //改变页面
            changeView();
            // 初始化数据
            changeData(true);
        }
        return mContentView;
    }

    /**
     * 改变页面view的方法
     * 子类如果想改变页面就重写该方法
     */
    protected void changeView(){

    }

    /**
     * 添加头部控件
     * @param headview
     */
    protected void addHeadView(View headview){
        FrameLayout headViewLayout = (FrameLayout) mContentView.findViewById(R.id.fl_head_layout);
        if(headViewLayout != null){
            headViewLayout.addView(headview);
            headViewLayout.setVisibility(View.VISIBLE);
        }
    }


    /* 摧毁视图 */
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        ((ViewGroup) mContentView.getParent()).removeView(mContentView);
    }

    /* 摧毁该Fragment，一般是FragmentActivity 被摧毁的时候伴随着摧毁 */
    @Override
    public void onDestroy() {
        HttpUtils.cancelAllRequests(mPageName);
        super.onDestroy();
    }

    /************************** fragment所有重写的方法 end **************************/

    /*************************** 所有操作数据的方法 start ***************/

    /**
     * 改变listview显示的数据
     *
     * @param isRefresh 是否刷新
     */
    protected abstract void changeData(final boolean isRefresh);


    /**
     * 重载的Loadview EmptyView的方法
     * @param code DATAEMPTY
     * @param resId 对应的图片
     * @param msg   暂时最多传两个String，第一个对应小字体，第二个对应加粗字体
     */
    protected  void setLoadView(int code,int resId,String... msg){
        switch(code){
            case DATAEMPTY:
                if (dataList == null || dataList.size() == 0) {
                    mLoadView.showEmptyPage(resId,msg);
                }
                if(mListView!= null && mListView.isRefreshing()){
                    mListView.onRefreshComplete();
                }
                break;
        }

    }

    /**
     * LoadViewd 方法
     * @param code 传入对应的值
     * @param msg  提示的的文字
     *
     *
     */
    protected void setLoadView(int code, CharSequence msg) {

        switch (code) {
            case NO_NET://网络错误
                if (dataList == null || dataList.size() == 0) {
                    mLoadView.showErrorPage(msg);
                }
                if(mListView != null){
                    mListView.onRefreshComplete();
                }
                break;
            case DATAERROR://数据错误
                if (dataList == null || dataList.size() == 0) {
                    mLoadView.showErrorPage(msg);
                }
                if(mListView != null){
                    mListView.onRefreshComplete();
                }
                break;
            case LOADING://加载中
                if (dataList == null || dataList.size() == 0) {
                    mLoadView.showLoadPage(msg);
                }
                break;
            case LOADSUCES://加载成功
                if (dataList == null || dataList.size() == 0) {
                    mLoadView.showSuccess();
                }
                if(mListView != null){
//                    mListView.onRefreshComplete();
                    mListView.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            mListView.onRefreshComplete();
                        }
                    }, 500);
                }
                break;
        }
        if (msg != null && !"".equals(msg)) {
            notify_view_text.setText(msg);
            notify_view_text.setVisibility(View.VISIBLE);
            new Handler().postDelayed(new Runnable() {

                @Override
                public void run() {
                    notify_view_text.setVisibility(View.GONE);
                }
            }, 2000);
        }
    }



    /**
     * 空的view
     * @param msg
     */
    protected void updateLoadViewEmpty(String msg){
        if (dataList == null || dataList.size() == 0) {
            mLoadView.showErrorPage(msg);
        }
        if(mListView != null){
            mListView.onRefreshComplete();
        }
    }


    /* 供外部调用刷新数据 */
    public void flushData() {
		if (mListView == null) {
			return;
		}
		mListView.onRefreshComplete();
		mListView.setRefreshing();
		mListView.getRefreshableView().setSelection(0);

    }

//    /* 供外部调用切换数据位置 */
//    public void exchangeData() {
//		if (mListView == null)
//			return;
//		if (mListView.getRefreshableView().getFirstVisiblePosition() != 0) {
//			mListView.getRefreshableView().setSelection(0);
//		} else {
//			mListView.getRefreshableView().setSelection(currentScrollY);
//		}
//    }

    /*************************** 所有操作数据的方法 end ***************/

    /************************
     * 所有的事件 start
     *************************/

    // 所有单机事件
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.error_page:// 重新加载页面数据
                if (mListView.isRefreshing())
                    break;
                changeData(true);
                break;

            default:

                break;
        }
    }

    // listview下拉刷新
    @Override
    public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
        dataPage = 1;//数据页数
        changeData(true);
    }

    // listview上拉请求下一页
    @Override
    public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
        dataPage++;
        changeData(false);
    }

    // 需要重写的 listview的item的单击事件
    @Override
    public abstract void onItemClick(AdapterView<?> parent, View view,
                                     int position, long id);

    //  设置listview的最后一行显示的监听事件
    public void setListViewOnLastItemVisibleListener() {
        //这句代码AppViewUtils.initPullToRefreshListView(getActivity(), mListView);
        //已经设置了listview自动加载下一页了
        //如果不想listview自动加载下一页就重写本方法设置listview最后一行显示的监听
    }

    ;


    /************************ 所有的事件 end *************************/

    /*****************请求网络 start ******************/

    /**
     * 发送一个post网络请求
     *
     * @param url           请求地址 不为空,否则执行失败回调
     * @param type          数据类型
     * @param parms         请求参数 可为空
     */

    protected void addPostRequest(@NonNull String url, @NonNull Type type, Map<String, String> parms, @NonNull HttpListener<?> httpListener) {

        HttpUtils.addPostRequest(url, type, mPageName, parms,httpListener);
    }

    /**
     * 发送一个缓存post网络请求
     *
     * @param url           请求地址 不为空,否则执行失败回调
     * @param type          数据类型
     * @param parms         请求参数 可为空
     */

    protected void addPostCacheRequest(@NonNull String url, @NonNull Type type, Map<String, String> parms, @NonNull HttpListener<?> httpListener) {

        HttpUtils.addPostCacheRequest(url, type, mPageName, parms,httpListener);
    }


}
